package com.csj.mvvm.widget;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.PopupWindow;

import com.csj.mvvm.utils.AppManager;

/**
 * 作者：csj
 * 修复7.1以上版本显示错误的问题,优化背景色
 */
public class PopupWindowFix extends PopupWindow {
    private boolean canDismiss = true;// 按返回键是否消失

    public PopupWindowFix(View contentView, int width, int height) {
        super(contentView, width, height);
        setHeight(height);
        setWidth(width);
        init();
    }

    // 这个构造方法，pop 的高度是WRAP_CONTENT,宽度是 MATCH_PARENT
    public PopupWindowFix(View contentView) {
        this(contentView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
    }

    @Override
    public void showAtLocation(View parent, int gravity, int x, int y) {
        backgroundAlpha(0.5f);
        super.showAtLocation(parent, gravity, x, y);
    }

    @Override
    public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) {
        backgroundAlpha(0.5f);
        super.showAsDropDown(anchor, xoff, yoff, gravity);
    }

    @Override
    public void showAsDropDown(View anchor, int xoff, int yoff) {
        showAsDropDown(anchor, xoff, yoff, Gravity.TOP | Gravity.START);
    }

    @Override
    public void showAsDropDown(View anchor) {
        showAsDropDown(anchor, 0, 0);
    }

    @Override
    public void dismiss() {
        if (canDismiss) {
            destroy();
            super.dismiss();
        }

//        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
//        StackTraceElement traceElement = stackTrace[3];
//        String fileName = traceElement.getFileName(); // 拿到调用 dismiss 方法的类名
//        fileName = fileName.substring(0, fileName.lastIndexOf("."));
//        if (!fileName.equals(PopupWindow.class.getSimpleName())) {
//            // 如果调用者不是从系统来的，那么就是我们认为的
//            destroy();
//            super.dismiss();
//        } else {
//            if (!canDismiss) {
//                return;
//            } else {
//                destroy();
//                super.dismiss();
//            }
//        }
    }

    protected void init() {
        // 在比较老的版本上，不设置背景就不能响应返回键和点击外部消失的，但是新版本google api 已经修改了，为了保险起见，设个背景最好
        setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        /**
         * 设置widow 是否获取焦点，默认false,如果为false,那么点击pop以外的区域，事件会传递到popu后面的（behind）界面上.
         * 点击pop 以外的区域pop 不会消失，注意如果pop 里面有输入框，那么输入框不能弹出键盘
         * 如果设置为true,pop 会有焦点，点击外部时 pop 会消失。
         */
        setFocusable(true);
        setOutsideTouchable(true);
    }

    // view: 任意一个已经显示在界面上的view，注意如果这个view 没有添加的 window 上时，这个方法会报错。
    // 因为 pop 在显示的时候需要通过 view.getWidowToken.
    public void showCenter(View view) {
        showAtLocation(view, Gravity.CENTER, 0, 0);
    }


    public void setDismiss(boolean dismiss) {
        canDismiss = dismiss;
    }

    private void destroy() {
        backgroundAlpha(1);
    }

    /**
     * 设置添加屏幕的背景透明度
     *
     * @param bgAlpha
     */
    public void backgroundAlpha(float bgAlpha) {
        try {
            Activity context = AppManager.Companion.getInstance().currentActivity();
            assert context != null;
            WindowManager.LayoutParams lp = context.getWindow().getAttributes();
            lp.alpha = bgAlpha;
            context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
            context.getWindow().setAttributes(lp);
        } catch (Exception e) {
        }
    }
}